package com.yami.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yami.shop.bean.app.dto.ShopHeadInfoDto;
import com.yami.shop.bean.app.param.ShopAuditingParam;
import com.yami.shop.bean.dto.ShopCreateInfoDTO;
import com.yami.shop.bean.dto.ShopSigningInfoDTO;
import com.yami.shop.bean.model.ShopDetail;
import com.yami.shop.bean.param.*;
import com.yami.shop.common.util.PageParam;
import org.apache.ibatis.annotations.Param;

import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;

/**
 * @author lgh on 2018/08/29.
 */
public interface ShopDetailService extends IService<ShopDetail> {

    /**
     * 修改店铺信息
     *
     * @param shopDetail 店铺信息参数
     */
    void updateShopDetail(ShopDetail shopDetail);

    /**
     * 通过经纬度计算距离
     *
     * @param lat    纬度
     * @param lng    经度
     * @param shopId 店铺id
     * @return 距离
     */
    double getDistance(Double lat, Double lng, Long shopId);

    /**
     * 根据店铺id获取店铺信息
     *
     * @param shopId 店铺id
     * @return 店铺信息
     */
    ShopDetail getShopDetailByShopId(Long shopId);

    /**
     * 删除店铺详情缓存
     *
     * @param shopId 店铺id
     */
    void removeShopDetailCacheByShopId(Long shopId);

    /**
     * 根据店铺的手机号（登陆账号），获取店铺信息
     *
     * @param mobile 手机号
     * @return 店铺详情
     */
    ShopDetail getShopByMobile(@Param("mobile") String mobile);

    /**
     * 修改用户密码
     *
     * @param username    用户名称/账号
     * @param newPassword 新密码
     */
    void updatePasswordByUserName(String username, String newPassword);


    /**
     * 根据用户id查询店铺信息
     *
     * @param userId 用户id
     * @return 店铺信息
     */
    ShopDetail getShopDetailByUserId(String userId);

    /**
     * 申请开店铺
     *
     * @param userId          用户id
     * @param shopDetailParam 店铺信息参数
     */
    void applyShop(String userId, ShopDetailParam shopDetailParam);

    /**
     * 审核商家信息
     *
     * @param shopAuditingParam 审核参数
     * @return 布尔值
     */
    boolean audit(ShopAuditingParam shopAuditingParam);

    /**
     * 平台 --下线活动商品
     *
     * @param shopDetail    店铺信息
     * @param offlineReason 下线原因
     * @param sysUserId     系统用户id
     */
    void offline(ShopDetail shopDetail, String offlineReason, Long sysUserId);

    /**
     * 申请审核
     *
     * @param eventId       事件id
     * @param handleId      店铺id
     * @param reapplyReason 重启申请原因
     */
    void auditApply(Long eventId, Long handleId, String reapplyReason);

    /**
     * 审核下线商店
     *
     * @param offlineHandleEventAuditParam 下线参数
     * @param sysUserId                    系统用户id
     * @return 审核是否通过
     */
    Boolean auditOfflineShop(OfflineHandleEventAuditParam offlineHandleEventAuditParam, Long sysUserId);

    /**
     * 热门店铺
     *
     * @return 热门店铺列表
     */
    List<ShopHeadInfoDto> listHotShopsHead();

    /**
     * 分页搜索店铺
     *
     * @param page            分页参数
     * @param shopHeadInfoDto 条件参数
     * @return 热搜店铺分页信息
     */
    Page<ShopHeadInfoDto> searchShops(PageParam<ShopHeadInfoDto> page, ShopHeadInfoDto shopHeadInfoDto);

    /**
     * 新增店铺
     *
     * @param shopDetail 店铺详情
     * @param count      数量
     */
    void insertDetail(ShopDetail shopDetail, Long count);

    /**
     * 统计店铺电话号码
     *
     * @param mobile 电话号码
     * @param shopId 店铺id
     * @return 数量
     */
    Long checkMobile(String mobile, Long shopId);

    /**
     * 修改店铺账号密码
     *
     * @param shopId   店铺id
     * @param password 密码
     * @param mobile   电话号码
     * @param count    数量
     */
    void updatePasswordOrMobile(Long shopId, String password, String mobile, Long count);

    /**
     * 批量修改店铺类型
     *
     * @param shopTypeParam 店铺类型参数
     */
    void batchUpdateShopType(ShopTypeParam shopTypeParam);

    /**
     * 根据店铺id提交开店申请
     *
     * @param shopId
     * @param employeeId
     */
    void apply(Long shopId, Long employeeId);

    /**
     * 平台创建店铺
     *
     * @param shopCreateInfoDTO
     * @param userId
     */
    void platformCreateShop(ShopCreateInfoDTO shopCreateInfoDTO, Long userId);

    /**
     * 根据店铺id更新店铺状态
     *
     * @param shopId
     * @param status
     */
    void updateStatus(Long shopId, Integer status);
    void updateCheckAge(Long shopId, String checkAge);
    /**
     * 根据签约时间修改店铺状态
     *
     * @param now
     */
    void changeShopStatusByContractTime(Date now);

    /**
     * 更新店铺签约信息
     *
     * @param shopSigningInfoDTO
     */
    void updateSigningInfo(ShopSigningInfoDTO shopSigningInfoDTO);

    /**
     * 导出店铺
     *
     * @param auditingInfoParam
     * @param response
     */
    void exportShop(AuditingInfoParam auditingInfoParam, HttpServletResponse response);

    /**
     * 分页获取店铺列表（营业、停业状态）
     *
     * @param page
     * @param shopSearchParam
     * @return
     */
    IPage<ShopHeadInfoDto> renovationShopPage(PageParam<ShopDetail> page, ShopSearchParam shopSearchParam);

    /**
     * 店铺列表（营业、停业状态）
     *
     * @param shopSearchParam
     * @return
     */
    List<ShopHeadInfoDto> listRenovationShop(ShopSearchParam shopSearchParam);

    /**
     * 根据店铺ids获取店铺详情列表
     *
     * @return
     */
    List<ShopDetail> getShopDetailByShopIds(List<Long> shopIds);

    /**
     * 定时任务计算并修改每个店铺评分
     */
    void computeShopScore(Long shopId);

    /**
     * 店铺开通新生账户
     */
    String xsAccountOpening(Long shopId);

    /**
     * 店铺开通新生账户上传资料
     */
    String xsAccountOpeningUpload(Long shopId);

    /**
     * 店铺信息修改
     */
    void enterpriseChangeInfo(Long shopId);

    /**
     * 用户资料审核异步通知
     */
    void auditNotice();

    /**
     * 功能描述: 获取开启数据同步店铺
     *
     * @Author: LSR
     * @Date: 2023/4/3 15:46
     */
    List<ShopDetail> getSynchronizationDataList();

    ShopDetail getShopDetailByShopCode(String shopCode);


    String consumptionGasByShopId(Long shopId, Integer gas);


    List<String> getAllShopShortNameList();


}
